#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include "ui_mainwindow.h"
#include "customTabStyle.h"
#include <QDir>
#include <QListWidget>
#include <QMainWindow>
#include <QMediaPlayer>
#include <QMediaMetaData>
#include <QPushButton>
#include <QSettings>
#include <QAudioOutput>
#include <QInputDialog>
#include <QTimer>
#include <QModelIndex>
#include <QGraphicsDropShadowEffect>
#include <QCheckBox>
#include <QFileInfo>
#include <QFileDialog>
#include <QDialogButtonBox>
#include <QStandardItemModel>
#include <QPropertyAnimation>
#include <qevent.h>
#include <QTableView>


#define AnimationLastTime 200

QT_BEGIN_NAMESPACE
namespace Ui {
class MainWindow;
}
QT_END_NAMESPACE

// 播放模式
enum PLAYMODE { ORDER_MODE, RANDOM_MODE, CIRCLE_MODE };

class  MainWindow : public QMainWindow
{
  Q_OBJECT

public:
  struct MusicMetaData {
      QImage image;
      QString title;
      QString author;       // 歌曲作者/艺术家
      QString albumTitle;
      QString duration;
      QString codec_name;//编码率
      QString sample_rate;//采样器
      QString bit_rate;//比特率
      QString filepath;//文件路径
  };
  struct MusicMetaDataBase
  {
      QString title;
      QString author;       // 歌曲作者/艺术家
      QString albumTitle;
      QString duration;
      QString filepath;//文件路径
      QString filename;

  };

  QTableView *custom_song_list=new QTableView();
  //重写函数
  bool eventFilter(QObject *obj, QEvent *event);
  void keyPressEvent(QKeyEvent *event);
  static QStringList MusicList();
  void startPlayMusic(QTableView *tableview);


  explicit MainWindow(QWidget *parent = nullptr);
  ~MainWindow();

public slots:
  // 播放处理
  void handlePlaySlot();
  // 模式
  void handleModeSlot();
  // 下一首
  void handleNextSlot();
  // 上一首
  void handlePreSlot();
  // 音乐路径选择
  void handleDirSlot();
  // 音乐列表
  void handleListSlot();
  // 已有歌单
  void handlePlaylistSolt();
  //控制音量
  void handleSoundSet();
  // 软件设置 setbutton.cpp
  void handleSoftwareSet();
  //从列表中查找歌曲
  void handleSongSearch();

private:
  //按钮以及一些组件的初始化
  void WidgetInit();
  // 设置按钮样式
  void setButtonStyle(QPushButton *button, const QString filename,
                      QString tooltip);
  //加载音乐文件(准备播放)
  //设置按钮样式(更强大)
  void CustomSetButtonStyle(QPushButton *button, const QString filename, int iconsize,
                            QString tooltip);
  //列表样式设置
  void setTableViewStyle(QTableView *tableview);
  //设置背景
  void setBackground(const QString filename);
  //加载音乐文件路径(目录)
  void loadMusicFileDir(QString DirPath);
  //加载已经下载的歌曲
  void loadDownLoadSong();
  //加载待播放的歌曲
  void loadMusicFileList();
  // 列表动画
  void ListAppear(QListWidget *listWidget);//出现
  void ListDisAppear(QListWidget *listWidget);//消失
  // 音乐列表右键菜单
  void SetListMenu(QString DirPath);
  // 显示进度条
  void DisplaySlider(QSlider *progressSlider, QMediaPlayer *player);//展示进度条
  //拖动进度条的函数
  void SilderRelease(QMediaPlayer *player,QSlider *progressSlider);
  void UpdateTime(QMediaPlayer *player);//更新时间,同步歌词位置
  // 读取歌词文件
  void readLyricsFile(const QString LyricsFilePath);
  //提取每句歌词的时间
  int readLyricsTime(QString timeTag);
  //歌词样式重置
  void ClearLyricStyle(QListWidget* listWidget,int index);
  //歌曲信息
  void MusicInfo();
  //除了歌词界面都隐藏
  void HideFirstWidget();
  //除了歌词界面都显示
  void ShowFirstWidget();
  //更换歌曲的时候调整某些组件
  void AdjustSongWidget(QTableView *tableview);



private:
    Ui::MainWindow *ui;
  // 音乐播放
  QMediaPlayer *music_player = nullptr;
  QAudioOutput *audioOutput = nullptr;
  // 播放模式
  PLAYMODE music_mode;
  //音乐路径
  QString DirPath;
  // 是否执行handlePlaySlot()
  bool play_music;
  //默认音乐目录加载路径
  QString Default_Music_Dir;
  //是否默认加载音乐列表loadMusicFileDir函数
  bool default_isload;
  //目录是否改变
  bool dir_change=false;
  //通过按钮操控的音乐列表(切换)
  QTableView *play_song_list;
  //自定义播放顺序的音乐



};
#endif // MAINWINDOW_H
